#!/usr/bin/env python3

import os

import common

class CrosstoolNgComponent(common.BuildComponent):
    def do_build(self, args):
        common.assert_crosstool_ng_supports_arch(args.arch)
        build_dir = self.get_build_dir(args)
        defconfig_dest = os.path.join(common.crosstool_ng_util_dir, 'defconfig')
        os.makedirs(common.crosstool_ng_util_dir, exist_ok=True)
        os.makedirs(common.crosstool_ng_download_dir, exist_ok=True)

        # Bootstrap out-ot-tree WONTFIX. I've tried.
        # https://github.com/crosstool-ng/crosstool-ng/issues/1021
        os.chdir(common.crosstool_ng_src_dir)
        common.run_cmd(
            [os.path.join(common.crosstool_ng_src_dir, 'bootstrap'), common.Newline],
        )
        os.chdir(common.crosstool_ng_util_dir)
        common.run_cmd(
            [
                os.path.join(common.crosstool_ng_src_dir, 'configure'), common.Newline,
                '--enable-local', common.Newline,
            ],
        )
        common.run_cmd(
            [
                'make', common.Newline,
                '-j', str(args.nproc), common.Newline,
            ],
        )

        # Build the toolchain.
        common.cp(
            os.path.join(common.root_dir, 'crosstool_ng_config', args.arch),
            defconfig_dest
        )
        common.write_configs(
            common.crosstool_ng_defconfig,
            [
                'CT_PREFIX_DIR="{}"'.format(common.crosstool_ng_install_dir),
                'CT_WORK_DIR="{}"'.format(build_dir),
                'CT_LOCAL_TARBALLS_DIR="{}"'.format(common.crosstool_ng_download_dir),
            ]
        )
        common.run_cmd(
            [
                common.crosstool_ng_executable, common.Newline,
                'defconfig', common.Newline,
            ],
        )
        os.unlink(defconfig_dest)
        common.run_cmd(
            [
                common.crosstool_ng_executable, common.Newline,
                'build', common.Newline,
                'CT_JOBS={}'.format(str(args.nproc)), common.Newline,
            ],
            out_file=os.path.join(build_dir, 'lkmc.log'),
            delete_env=['LD_LIBRARY_PATH'],
            extra_paths=[common.ccache_dir],
        )

    def get_argparse_args(self):
        return {
            'description': '''\
Build crosstool-NG with Newlib for bare metal compilation'
'''
        }

    def get_build_dir(self, args):
        return common.crosstool_ng_build_dir

if __name__ == '__main__':
    CrosstoolNgComponent().main()
